package com.huihua.it.aop;

import com.huihua.it.common.ResultData;
import com.huihua.it.enums.I18nEnum;
import com.huihua.it.util.I18nUtils;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

import javax.servlet.http.HttpServletRequest;
import java.util.*;

/**
 * @author Huihua.Chang
 */
@Aspect
@Component
@AllArgsConstructor
@ConditionalOnProperty(prefix = "lang", name = "open", havingValue = "true")
public class LanguageAspect {

    @Autowired
    I18nUtils i18nUtils;

    @Pointcut("execution(public * com.huihua.it.controller.*.*(..))")
    public void annotationLangCut() {
    }

    /**
     * 拦截controller层返回的结果，修改msg字段
     * @param point
     * @param obj
     */
    @AfterReturning(pointcut = "annotationLangCut()", returning = "obj")
    public void around(JoinPoint point, Object obj) {
        Object resultObject = obj;
        try {
            RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
            //从获取RequestAttributes中获取HttpServletRequest的信息
            HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);
            String langFlag = request.getHeader("lang").toLowerCase();
            if (null != langFlag) {
                ResultData r = (ResultData) obj;
                String msg = r.getCode()+"";
                Locale locale = null;
                if (StringUtils.isNotEmpty(msg)) {
                    switch (I18nEnum.fromValue(langFlag)){
                        case ZH_CN:
                            // 中文大陆
                            locale = Locale.CHINA;
                            msg = i18nUtils.getKey(msg, locale);
                            break;
                        case ZH_TW:
                            // 中文台湾
                            locale = Locale.TAIWAN;
                            msg = i18nUtils.getKey(msg, locale);
                            break;
                        case EN_US:
                            // 英文美国
                            locale = Locale.US;
                            msg = i18nUtils.getKey(msg, locale);
                            break;
                        case KO_KR:
                            // 韩文
                            locale = Locale.KOREA;
                            msg = i18nUtils.getKey(msg, locale);
                            break;
                        case JA_JP:
                            // 日文
                            locale = Locale.JAPAN;
                            msg = i18nUtils.getKey(msg, locale);
                            break;
                        default:
                            // 自定义
                            msg = i18nUtils.getKey(msg);
                            break;
                    }
//                    if (I18nEnum.ZH_CN.code.equals(langFlag)) {
//                        Locale locale = Locale.CHINA;
//                        msg = i18nUtils.getKey(msg, locale);
//                    } else if (I18nEnum.EN_US.code.equals(langFlag)) {
//                        Locale locale = Locale.US;
//                        msg = i18nUtils.getKey(msg, locale);
//                    } else {
//                        msg = i18nUtils.getKey(msg);
//                    }
                }
                r.setMessage(msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
            //返回原值
            obj = resultObject;
        }
    }
}
